ATLAS/ICESat-2 Monthly Gridded Sea Ice Thickness¶
This notebook highlights some simple code for visualizing monthly gridded sea ice thickness for three winter periods: winter 2018-19, 2019-20, and 2020-21.
import os
import xarray as xr
import numpy as np
import pandas as pd
# Remove warnings to improve display
import warnings
warnings.filterwarnings('ignore')
# Import utils
from utils.misc_utils import is2_interp2d, restrictRegionally, compute_winter_means
from utils.read_data_utils import read_is2_data, read_book_data
from utils.plotting_utils import plot_winter_means, plotArcticMaps, polarComparisonMaps, polar_fig_and_axes, interactive_lineplot, interactive_map
# Plotting
import hvplot.xarray
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.axes import Axes
from cartopy.mpl.geoaxes import GeoAxes
from textwrap import wrap
import matplotlib as mpl
import matplotlib.pyplot as plt
GeoAxes._pcolormesh_patched = Axes.pcolormesh
%config InlineBackend.figure_format = 'retina'
mpl.rcParams['figure.dpi'] = 200
1) Read data¶
Set desired date range¶
Our analysis looks at winter data, so we’ll only load data for the Northern Hemisphere’s winter season (Nov-Apr)
winter18_19 = pd.date_range(start="2018-11-01", end="2019-04-01", freq="MS")
winter19_20 = pd.date_range(start="2019-09-01", end="2020-04-01", freq="MS")
winter20_21 = pd.date_range(start="2020-09-01", end="2021-04-01", freq="MS")
winter_months = winter18_19.append(winter19_20).append(winter20_21)
print(winter_months)
DatetimeIndex(['2018-11-01', '2018-12-01', '2019-01-01', '2019-02-01',
'2019-03-01', '2019-04-01', '2019-09-01', '2019-10-01',
'2019-11-01', '2019-12-01', '2020-01-01', '2020-02-01',
'2020-03-01', '2020-04-01', '2020-09-01', '2020-10-01',
'2020-11-01', '2020-12-01', '2021-01-01', '2021-02-01',
'2021-03-01', '2021-04-01'],
dtype='datetime64[ns]', freq=None)
Read in ICESat-2 data¶
If the data doesn’t already exist in the user’s local drive, the function read_is2_data will download the files from the google storage bucket.
ds = read_is2_data() # Read in data
ds = ds.sel(time=winter_months) # Get winter months
print(ds)
<xarray.Dataset>
Dimensions: (time: 22, y: 448, x: 304)
Coordinates:
* time (time) datetime64[ns] 2018-11-01 ... 2021-04-01
longitude (y, x) float32 168.3 168.1 168.0 ... -10.36 -10.18 -9.999
latitude (y, x) float32 31.1 31.2 31.3 31.39 ... 34.68 34.58 34.47
xgrid (y, x) float32 -3.838e+06 -3.812e+06 ... 3.738e+06
ygrid (y, x) float32 5.838e+06 5.838e+06 ... -5.338e+06
Dimensions without coordinates: y, x
Data variables:
projection (time) float64 -2.147e+09 -2.147e+09 ... -2.147e+09
ice_thickness (time, y, x) float32 nan nan nan nan ... nan nan nan nan
ice_thickness_unc (time, y, x) float32 nan nan nan nan ... nan nan nan nan
num_segments (time, y, x) float32 nan nan nan nan ... nan nan nan nan
mean_day_of_month (time, y, x) float32 nan nan nan nan ... nan nan nan nan
snow_depth (time, y, x) float32 nan nan nan nan ... nan nan nan nan
snow_density (time, y, x) float32 nan nan nan nan ... nan nan nan nan
freeboard (time, y, x) float32 nan nan nan nan ... nan nan nan nan
ice_type (time, y, x) float32 nan nan nan nan ... nan nan nan nan
ice_density (time, y, x) float32 nan nan nan nan ... nan nan nan nan
Attributes:
contact: Alek Petty (alek.a.petty@nasa.gov)
description: Gridded Feb 2020 Arctic sea ice thickness and ancillary dat...
reference: Data doi: 10.5067/CV6JEXEE31HF. Original methodology descri...
history: Created 22/04/21
Set interpolation preferences¶
The dataset included uninterpolated data, or we can interpolate the data using linear interpolation or a simple nearest neighbor interpolation function. Because ICESat-2 doesn’t provide full monthly coverage, interpolating fills missing grid cells with a best guess based on surrounding data. This helps avoid sampling biases when performing time series analyses, with the cavaet that this interpolation method is subjective.
In order to define the interpolation bounds (so that we don’t try and interpolate over land, or other areas where there wouldn’t be sea ice!), we use the NOAA/NSIDC Climate Data Record of Passive Microwave Sea Ice Concentration dataset to infer the location of the sea ice. By setting interpolation=True, the code calls an interpolation function that is defined in the misc_utils.py module.
%%time
# Set interpolation preferences
interpolate = True
interp_method = "nearest"
# Read book data. This contains the CDR data, which we'll use for interpolating
book_ds = read_book_data()
book_ds = book_ds.sel(time=winter_months) # Get winter months
# Interpolate
if (interpolate == True):
print("Interpolating ICESat-2 data...")
cdr_da = book_ds["cdr_seaice_conc_monthly"] # Get CDR data
ds = is2_interp2d(ds, cdr_da, method=interp_method, interp_var='all')
print("Complete!")
# Combine datasets
ds = xr.merge([ds, book_ds])
ds = ds.drop_vars("projection")
Interpolating ICESat-2 data...
Complete!
CPU times: user 41.8 s, sys: 1.58 s, total: 43.4 s
Wall time: 43.6 s
2) Restrict data to a given region¶
We’ve built a region mask for the Arctic into the dataset used for this book; see the data wrangling notebook for more information. The region mask is included as a coordinate in the dataset, allowing us to easily access the different regions. You can restrict the data by selecting keys corresponding to regions of interest.
We are often interested in a region called the Inner Arctic, which is defined as the combined area of the Central Arctic, Beaufort Sea, Chukchi Sea, E Siberian Sea and the Laptev Sea. Figure from Petty et al., (2020):

Each region is defined by a specific integer key value. We can select the region/s defined by the key/s by using the restrictRegionally function, defined in the misc_utils module. Here, we’ll restrict the data to the Inner Arctic by selected the key values [10,11,12,13,15], corresponding to the five regions described above.
regions = pd.DataFrame({"labels":ds.region_mask.attrs["labels"]}, index=ds.region_mask.attrs["keys"])
print(regions)
labels
0 Lakes, extended coast
1 non-region oceans
2 Sea of Okhotsk and Japan
3 Bering Sea
4 Hudson Bay
5 Gulf of St. Lawrence
6 Baffin Bay, Davis Strait & Labrador Sea
7 Greenland Sea
8 Barents Seas
9 Kara Sea
10 Laptev Sea
11 East Siberian Sea
12 Chukchi Sea
13 Beaufort Sea
14 Canadian Archipelago
15 Arctic Ocean
20 Land
21 Coast
innerArcticKeys = [10,11,12,13,15] #Inner Arctic
ds_innerArctic = restrictRegionally(ds, innerArcticKeys)
Regions selected: Inner Arctic
On the map below, you can see how the data has been cut to show only gridcells in the Inner Arctic!
date = "Feb 2019"
fig, axes = polar_fig_and_axes(hemisphere="nh", num_rows=1, num_columns=2, lat=55, show_map_features=True)
im1 = ds["ice_thickness"].sel(time=date)[0].plot.pcolormesh(ax=axes[0], x='longitude', y='latitude', vmin=0, vmax=4, extend='both', transform=ccrs.PlateCarree(), add_colorbar=False)
im2 = ds_innerArctic["ice_thickness"].sel(time=date)[0].plot.pcolormesh(ax=axes[1], x='longitude', y='latitude', vmin=0, vmax=4, extend='both', transform=ccrs.PlateCarree(), add_colorbar=False)
axes[0].set_title("Arctic sea ice thickness ("+date+")")
axes[1].set_title("Inner Arctic sea ice thickness ("+date+")")
plt.colorbar(im1, cax=fig.add_axes([0.93, 0.326, 0.025, 0.352]), extend='both', label="sea ice thickness (m)")
plt.show()
3) Plot mean sea ice thickness over time¶
We’ll use the function plot_winter_means defined in the plotting_utils module to generate a line plot of mean sea ice thickness by month. This function also allows you to plot the uncertainty as shading around the line. Sea ice thickness is provided as a data variable in the ATLAS/ICESat-2 Monthly Gridded Sea Ice Freeboard dataset.
# Do you want to use the Inner Arctic restricted data or the entire, unrestricted region?
use_innerArctic = True
# Grab sea ice thickness and uncertainty from the dataset
if use_innerArctic == True:
thickness = ds_innerArctic["ice_thickness"] # Sea ice thickness
thickness_unc = ds_innerArctic["ice_thickness_unc"] # Sea ice thickness uncertainty
else:
thickness = ds["ice_thickness"]
thickness_unc = ds_innerArctic["ice_thickness_unc"]
# Descriptive info regarding whether or not the data has been interpolated
if interpolate==True:
interp_descrip = " (interpolated)" # Description to add to plot titles
else:
interp_descrip = "" # empty string
Compute mean monthly winter sea ice thickness¶
ICESat2 has varying coverage by month based on its oribal path and cloud coverage. In order to avoid the mean being artificially inflated or deflated due to varying coverage over the course of the season, we ensure that we’re only computing the mean in regions that have good coverage. This is looped into the compute_means function; see the function in the misc_utils module for more information.
mean_winter_thickness = compute_winter_means(thickness)
display(mean_winter_thickness)
| time period | Winter 2018-19 | Winter 2019-20 | Winter 2020-21 |
|---|---|---|---|
| month | |||
| Sep | NaN | 1.353715 | 1.161614 |
| Oct | NaN | 1.270545 | 1.052572 |
| Nov | 1.206516 | 1.202967 | 0.927755 |
| Dec | 1.429245 | 1.327576 | 1.131299 |
| Jan | 1.647857 | 1.615521 | 1.456750 |
| Feb | 1.890510 | 1.848658 | 1.697177 |
| Mar | 2.021039 | 1.952370 | 1.870251 |
| Apr | 2.132214 | 1.994546 | 1.979356 |
Static plot¶
Here, we’ll generate a lineplot to show the winter means and the associated uncertainty in the measurement.
##### STILL WORKING ON UPDATING THIS FUNCTION TO REFLECT THE BUSINESS OF NANNING GRIDCELLS ACROSS MONTHS.
##### WOULD BE GOOD TO COMBINE THE PLOTTING FUNCTIONALITY WITH THE compute_winter_means FUNCTION IN THE misc_utils MODULE
#start_year = str(winter_months[0].year)
#end_year = str(winter_months[-1].year)
#plot_winter_means(da=thickness, start_year=start_year, end_year=end_year,
# show_uncertainty=False,
# title="Mean monthly sea ice thickness"+interp_descrip)
4) Map mean winter ice thickness¶
Using the cartopy mapping package for python, we overlay mean ice thickness for each winter season on a basemap of the Arctic.
NOTE: ICESat-2 only started collecting data in November 2018. The periods for the mean has been shortened to Nov-Apr, and the line plots for winter 2018-19 will show less data, since no data was available for September or October 2018.
Compute gridcell mean sea ice thickness¶
Here, we’ll compute the mean value in each gridcell for the period of Nov-Apr for each winter season.
# Compute mean and add descriptive attributes
winter1_mean = thickness.sel(time=winter18_19).mean(dim="time").assign_coords({"time":"Nov 2018 - Apr 2019"})
winter2_mean = thickness.sel(time=winter19_20[2:]).mean(dim="time").assign_coords({"time":"Nov 2019 - Apr 2020"})
winter3_mean = thickness.sel(time=winter20_21[2:]).mean(dim="time").assign_coords({"time":"Nov 2020 - Apr 2021"})
Plot winter means on a map of the arctic¶
Here, we’ll use the function plotArcticMaps defined in the plotting_utils module to generate the maps.
# Generate maps of each mean
means_all = xr.concat([winter1_mean, winter2_mean, winter3_mean], dim="time")# All means in one dataset
plotArcticMaps(means_all, minval=0, maxval=4, title="Gridcell mean sea ice thickness"+interp_descrip)
Compare the means for each winter¶
The rightmost plot shows gridcell difference in the means, allowing you to better understand spatial patterns in differences between two winter seasons. To generate these plots, we use a function named polarComparisonMaps, which takes two datasets as its input. See the plotting_utils module to see the function and more details on its utility and construction. Here, we’ll feed the function the gridcell means for two winter seasons, and some descriptive labels and such in the function arguments to improve the figure output.
y="latitude"
x="longitude"
colorbar=True
clabel="sea ice thickness (m)"
vmin=None
vmax=None
cmap="viridis"
title=None
hemisphere="nh"
lat=60
max_lat=90
pl1 = winter1_mean.hvplot.quadmesh(y=y, x=x,
colorbar=False, clim=(0,4), cmap=cmap,
title=winter1_mean.time.values.item(), features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
pl2 = winter2_mean.hvplot.quadmesh(y=y, x=x,
colorbar=False, clim=(0,4), cmap=cmap,
title=winter2_mean.time.values.item(), features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
pl3 = winter3_mean.hvplot.quadmesh(y=y, x=x,
colorbar=True, clim=(0,4), clabel=clabel, cmap=cmap,
title=winter3_mean.time.values.item(), features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
pl1
import holoviews as hv
y="latitude"
x="longitude"
colorbar=True
clabel="sea ice thickness (m)"
vmin=None
vmax=None
cmap="viridis"
title=None
hemisphere="nh"
lat=60
max_lat=90
pl1 = winter2_mean.hvplot.quadmesh(y=y, x=x,
colorbar=False, clim=(0,4), cmap=cmap,
title=winter2_mean.time.values.item()+" mean", features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
pl2 = winter3_mean.hvplot.quadmesh(y=y, x=x,
colorbar=True, clim=(0,4), clabel=clabel, cmap=cmap,
title=winter3_mean.time.values.item()+" mean", features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
diff = winter3_mean - winter2_mean
diff.attrs["long_name"] = "sea ice thickness gridcell difference"
pl3 = diff.hvplot.quadmesh(y=y, x=x,
colorbar=True, clim=(-1.5,1.5), clabel="gridcell difference", cmap="coolwarm",
title="winter 2020-21 - winter 2019-20", features=["coastline"],
projection=ccrs.NorthPolarStereo(central_longitude=-45), geo=True, project=True,
frame_width=215, ylim=(lat,max_lat), xlim=(-180,180),
dynamic=False)
data_pl = (pl1+pl2+pl3).opts(hv.opts.Layout(shared_axes=False, merge_tools=True))
display(data_pl)
hvplot.save(data_pl, 'mean_diff.html')
# Winter 2018-2019 and Winter 2019-2020 differences
polarComparisonMaps(data1=winter1_mean, label1="Winter 2018-19",
data2=winter2_mean, label2="Winter 2019-20",
vmin=0, vmax=4, vmin_diff=-1.5, vmax_diff=1.5,
title="Mean winter sea ice thickness (November -> April)")
# Winter 2019-2020 and Winter 2020-2021 differences
polarComparisonMaps(data1=winter2_mean, label1="Winter 2019-20",
data2=winter3_mean, label2="Winter 2020-21",
vmin=0, vmax=4, vmin_diff=-1.5, vmax_diff=1.5,
title="Mean winter sea ice thickness (November -> April)")
# Winter 2018-2019 and Winter 2020-2021 differences
polarComparisonMaps(data1=winter1_mean, label1="Winter 2018-19",
data2=winter3_mean, label2="Winter 2020-21",
vmin=0, vmax=4, vmin_diff=-1.5, vmax_diff=1.5,
title="Mean winter sea ice thickness (November -> April)")
Generate interactive maps¶
This allows you to scroll over individual gridcells and zoom in on regions of interest
import holoviews as hv
import hvplot.xarray
from utils.plotting_utils import compute_vmin_vmax
y="latitude"
x="longitude"
colorbar=True
vmin=None
vmax=None
clabel=""
cmap="viridis"
title=None
hemisphere="nh"
lat=60
width=600
height=350
da = thickness.sel(time=winter18_19)
vmin=0
vmax=4
clabel="sea ice thickness (m)"
if hemisphere=="nh":
max_lat = 90
projection = ccrs.NorthPolarStereo(central_longitude=-45)
elif hemisphere=="sh":
max_lat = -90
projection = ccrs.SouthPolarStereo()
if lat > 0:
lat = -lat
vmin_auto, vmax_auto = compute_vmin_vmax(da)
clim = [vmin,vmax]
if vmin is None:
clim[0] = vmin_auto
if vmax is None:
clim[1] = vmax_auto
help(da.hvplot.quadmesh)
da.hvplot.quadmesh(y=y, x=x,
colorbar=colorbar, clim=tuple(clim), clabel=clabel, cmap=cmap,
title=title, features=["coastline"],
projection=projection, geo=True, project=True,
ylim=(lat,max_lat), responsive=True,
dynamic=False)
interactive_map(thickness.sel(time=winter19_20), vmin=0, vmax=4, clabel="sea ice thickness (m)")
interactive_map(thickness.sel(time=winter20_21), vmin=0, vmax=4, clabel="sea ice thickness (m)")
rasm = xr.tutorial.open_dataset('rasm').load()
rasm.hvplot.quadmesh(
'xc', 'yc', crs=ccrs.PlateCarree(), projection=ccrs.PlateCarree(),
ylim=(0, 90), cmap='viridis', project=True, geo=True,
rasterize=True, coastline=True, frame_width=800, dynamic=False,
)
Plot maps for each month¶
We can use the same function plotArcticMaps to plot the data for each month.
for winter_n in [winter18_19, winter19_20, winter20_21]:
plotArcticMaps(thickness.sel(time=winter_n), minval=0, maxval=3, title="Winter "+str(winter_n[0].year)+"-"+str(winter_n[-1].year) + " sea ice thickness")
# Set winter months
winter18_19 = pd.date_range(start="2018-11-01", end="2019-04-01", freq="MS")
winter19_20 = pd.date_range(start="2019-09-01", end="2020-04-01", freq="MS")
winter20_21 = pd.date_range(start="2020-09-01", end="2021-04-01", freq="MS")
winter_months = winter18_19.append(winter19_20).append(winter20_21)
ds_uninterpolated = read_is2_data() # Read in data
# Read book data. This contains the CDR data, which we'll use for interpolating
book_ds = read_book_data()
book_ds = book_ds.sel(time=winter_months) # Get winter months
# Interpolate
print("Interpolating ICESat-2 data...")
cdr_da = book_ds["cdr_seaice_conc_monthly"] # Get CDR data
ds_interpolated = is2_interp2d(ds_uninterpolated, cdr_da, method='nearest', interp_var='all')
print("Complete!")
# Combine datasets
ds_interpolated = xr.merge([ds_interpolated, book_ds])
ds_interpolated = ds_interpolated.drop_vars("projection")
ds_uninterpolated = ds_uninterpolated.drop_vars("projection")
#https://hvplot.holoviz.org/user_guide/Geographic_Data.html
date="2021-04"
thickness_interp = ds_interpolated["ice_thickness"]
thickness_uninterp = ds_uninterpolated["ice_thickness"]
# PLOT!!
winter1_mean.hvplot.quadmesh(y="latitude",x="longitude",
colorbar=False, clim=(0,4), clabel="sea ice thickness (m)",
projection=ccrs.NorthPolarStereo(central_longitude=-45), cmap="viridis", features=["coastline"],
title="uninterpolated sea ice thickness ",
project=True, geo=True, width=450, height=300, ylim=(60,90)) + \
winter2_mean.hvplot.quadmesh(y="latitude",x="longitude",
colorbar=True, clim=(0,4), clabel="sea ice thickness (m)",
projection=ccrs.NorthPolarStereo(central_longitude=-45), cmap="viridis", features=["coastline"],
title="interpolated sea ice thickness ",
project=True, geo=True, width=500, height=300, ylim=(60,90))
a = np.linspace(1, 101, 101)
b = np.linspace(1,11,11)
c = np.linspace(1,4,4)
grid_a, grid_b, grid_c=np.meshgrid(a,b,c)
grid_d=np.sin(grid_a.flatten()*grid_b.flatten()*grid_c.flatten())
df=pd.DataFrame(data={'A':grid_a.flatten(),'B':grid_b.flatten(),'C':grid_c.flatten(),'D':grid_d})
line_hvplot=df.hvplot.line(x='A', y='D',groupby=['B','C'], dynamic=True)
line_hvplot
da
<xarray.DataArray 'ice_thickness' (time: 6, y: 448, x: 304)>
array([[[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]],
[[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]],
[[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
...
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]],
[[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]],
[[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 2018-11-01 2018-12-01 ... 2019-04-01
longitude (y, x) float32 168.3 168.1 168.0 167.8 ... -10.36 -10.18 -9.999
latitude (y, x) float32 31.1 31.2 31.3 31.39 ... 34.78 34.68 34.58 34.47
xgrid (y, x) float32 -3.838e+06 -3.812e+06 ... 3.712e+06 3.738e+06
ygrid (y, x) float32 5.838e+06 5.838e+06 ... -5.338e+06 -5.338e+06
region_mask (y, x) uint8 1 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1
Dimensions without coordinates: y, x
Attributes:
description: Mean sea ice thickness from redistributed (piecewise) NES...
units: meters
long_name: sea ice thickness
interpolation: interpolated from original variable using nearest interpo...- time: 6
- y: 448
- x: 304
- nan nan nan nan nan nan nan nan ... nan nan nan nan nan nan nan nan
array([[[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]], [[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]], [[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., ... ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]], [[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]], [[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32) - time(time)datetime64[ns]2018-11-01 ... 2019-04-01
array(['2018-11-01T00:00:00.000000000', '2018-12-01T00:00:00.000000000', '2019-01-01T00:00:00.000000000', '2019-02-01T00:00:00.000000000', '2019-03-01T00:00:00.000000000', '2019-04-01T00:00:00.000000000'], dtype='datetime64[ns]') - longitude(y, x)float32168.3 168.1 168.0 ... -10.18 -9.999
- units :
- degrees East
- long_name :
- longitude
array([[168.32042 , 168.14876 , 167.97641 , ..., 102.71974 , 102.544685, 102.370316], [168.4334 , 168.26143 , 168.08879 , ..., 102.608604, 102.433235, 102.258545], [168.54704 , 168.37479 , 168.20184 , ..., 102.49679 , 102.3211 , 102.146095], ..., [-80.970955, -80.79312 , -80.61448 , ..., -10.108099, -9.926246, -9.745198], [-80.842575, -80.665 , -80.48663 , ..., -10.234803, -10.053245, -9.872486], [-80.71499 , -80.53768 , -80.35958 , ..., -10.360703, -10.179442, -9.998976]], dtype=float32) - latitude(y, x)float3231.1 31.2 31.3 ... 34.58 34.47
- units :
- degrees North
- long_name :
- latitude
array([[31.102673, 31.199413, 31.295801, ..., 31.677736, 31.582802, 31.4875 ], [31.25011 , 31.34728 , 31.444096, ..., 31.82774 , 31.73238 , 31.63665 ], [31.397564, 31.495165, 31.592411, ..., 31.977772, 31.881985, 31.785826], ..., [34.345894, 34.45253 , 34.55881 , ..., 34.980267, 34.87546 , 34.77028 ], [34.198696, 34.304863, 34.41067 , ..., 34.830242, 34.725906, 34.621197], [34.05146 , 34.157154, 34.262493, ..., 34.680187, 34.576324, 34.472084]], dtype=float32) - xgrid(y, x)float32-3.838e+06 -3.812e+06 ... 3.738e+06
- units :
- meters
- long_name :
- projection grid x values
array([[-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.], [-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.], [-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.], ..., [-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.], [-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.], [-3837500., -3812500., -3787500., ..., 3687500., 3712500., 3737500.]], dtype=float32) - ygrid(y, x)float325.838e+06 5.838e+06 ... -5.338e+06
- units :
- meters
- long_name :
- projection grid y values
array([[ 5837500., 5837500., 5837500., ..., 5837500., 5837500., 5837500.], [ 5812500., 5812500., 5812500., ..., 5812500., 5812500., 5812500.], [ 5787500., 5787500., 5787500., ..., 5787500., 5787500., 5787500.], ..., [-5287500., -5287500., -5287500., ..., -5287500., -5287500., -5287500.], [-5312500., -5312500., -5312500., ..., -5312500., -5312500., -5312500.], [-5337500., -5337500., -5337500., ..., -5337500., -5337500., -5337500.]], dtype=float32) - region_mask(y, x)uint81 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1
- description :
- NSIDC region mask for the Arctic
- keys :
- [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 20 21]
- labels :
- ['Lakes, extended coast', 'non-region oceans', 'Sea of Okhotsk and Japan', 'Bering Sea', 'Hudson Bay', 'Gulf of St. Lawrence', 'Baffin Bay, Davis Strait & Labrador Sea', 'Greenland Sea', 'Barents Seas', 'Kara Sea', 'Laptev Sea', 'East Siberian Sea', 'Chukchi Sea', 'Beaufort Sea', 'Canadian Archipelago', 'Arctic Ocean', 'Land', 'Coast']
- note :
- keys and labels ordered to match by index
array([[ 1, 1, 1, ..., 20, 20, 20], [ 1, 1, 1, ..., 20, 20, 20], [ 1, 1, 1, ..., 20, 20, 20], ..., [20, 20, 20, ..., 1, 1, 1], [20, 20, 20, ..., 1, 1, 1], [20, 20, 20, ..., 1, 1, 1]], dtype=uint8)
- description :
- Mean sea ice thickness from redistributed (piecewise) NESOSIM data.
- units :
- meters
- long_name :
- sea ice thickness
- interpolation :
- interpolated from original variable using nearest interpolation